/**
 * 验证规则工具类
 */

export const validatorRule = {
  /**
   * 验证一般字符（字母、数字、下划线）
   */
  IS_GENERAL: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^[a-zA-Z0-9_]+$/;
    return pattern.test(value);
  },

  /**
   * 验证一般字符（字母、数字、下划线、中文）
   */
  IS_GENERAL_WITH_CHINESE: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^[a-zA-Z0-9_\u4e00-\u9fa5]+$/;
    return pattern.test(value);
  },

  /**
   * 验证邮箱
   */
  IS_EMAIL: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
    return pattern.test(value);
  },

  /**
   * 验证手机号
   */
  IS_MOBILE: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^1[3-9]\d{9}$/;
    return pattern.test(value);
  },

  /**
   * 验证身份证号
   */
  IS_ID_CARD: (value: string): boolean => {
    if (!value) return true;
    const pattern = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
    return pattern.test(value);
  },

  /**
   * 验证URL
   */
  IS_URL: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i;
    return pattern.test(value);
  },

  /**
   * 验证IP地址
   */
  IS_IP: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
    return pattern.test(value);
  },

  /**
   * 验证数字
   */
  IS_NUMBER: (value: string | number): boolean => {
    if (value === '' || value === null || value === undefined) return true;
    return !isNaN(Number(value));
  },

  /**
   * 验证正整数
   */
  IS_POSITIVE_INTEGER: (value: string | number): boolean => {
    if (value === '' || value === null || value === undefined) return true;
    const num = Number(value);
    return Number.isInteger(num) && num > 0;
  },

  /**
   * 验证密码强度（至少8位，包含大小写字母和数字）
   */
  IS_STRONG_PASSWORD: (value: string): boolean => {
    if (!value) return true;
    const pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$/;
    return pattern.test(value);
  },

  /**
   * 验证长度范围
   */
  LENGTH_RANGE: (min: number, max: number) => {
    return (value: string): boolean => {
      if (!value) return true;
      return value.length >= min && value.length <= max;
    };
  },

  /**
   * 验证数值范围
   */
  NUMBER_RANGE: (min: number, max: number) => {
    return (value: string | number): boolean => {
      if (value === '' || value === null || value === undefined) return true;
      const num = Number(value);
      return !isNaN(num) && num >= min && num <= max;
    };
  }
};

export default validatorRule; 